b5af2041f94098c41c52dd20a808c9f04f5d5dd8,flexbox/src/main/java/com/google/android/flexbox/FlexboxLayout.java,FlexboxLayout,expandFlexItems,#FlexLine#number#number#number#number#,929
Before Change
accumulatedRoundError += 1.0;
}
}
child.measure(MeasureSpec.makeMeasureSpec(child.getMeasuredWidth(),
MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(newHeight, MeasureSpec.EXACTLY));
}
flexLine.mMainSize += child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
After Change
// direction to enclose its content (in the measureHorizontal method), but
// the width will be expanded in this method. In that case, the height needs to be measured
// again with the expanded width.
flexLine.mCrossSize = Integer.MIN_VALUE;
float accumulatedRoundError = 0;
for (int i = 0; i < flexLine.mItemCount; i++) {
View child = getReorderedChildAt(childIndex);
if (child == null) {
continue;
} else if (child.getVisibility() == View.GONE) {
childIndex++;
continue;
}
LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (isMainAxisDirectionHorizontal(flexDirection)) {
// The direction of the main axis is horizontal
if (!mChildrenFrozen[childIndex]) {
float rawCalculatedWidth = child.getMeasuredWidth() + unitSpace * lp.flexGrow;
if (i == flexLine.mItemCount - 1) {
rawCalculatedWidth += accumulatedRoundError;
accumulatedRoundError = 0;
}
int newWidth = Math.round(rawCalculatedWidth);
if (newWidth > lp.maxWidth) {
// This means the child can't expand beyond the value of the maxWidth attribute.
// To adjust the flex line length to the size of maxMainSize, remaining
// positive free space needs to be re-distributed to other flex items
// (children views). In that case, invoke this method again with the same
// startIndex.
needsReexpand = true;
newWidth = lp.maxWidth;
mChildrenFrozen[childIndex] = true;
flexLine.mTotalFlexGrow -= lp.flexGrow;
} else {
accumulatedRoundError += (rawCalculatedWidth - newWidth);
if (accumulatedRoundError > 1.0) {
newWidth += 1;
accumulatedRoundError -= 1.0;
} else if (accumulatedRoundError < -1.0) {
newWidth -= 1;
accumulatedRoundError += 1.0;
}
}
int childHeightMeasureSpec = getChildHeightMeasureSpec(heightMeasureSpec, lp);
child.measure(MeasureSpec.makeMeasureSpec(newWidth, MeasureSpec.EXACTLY),
childHeightMeasureSpec);
}
flexLine.mMainSize += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
flexLine.mCrossSize = Math.max(flexLine.mCrossSize, child.getMeasuredHeight());
} else {
// The direction of the main axis is vertical
if (!mChildrenFrozen[childIndex]) {
float rawCalculatedHeight = child.getMeasuredHeight() + unitSpace * lp.flexGrow;
if (i == flexLine.mItemCount - 1) {
rawCalculatedHeight += accumulatedRoundError;
accumulatedRoundError = 0;
}
int newHeight = Math.round(rawCalculatedHeight);
if (newHeight > lp.maxHeight) {
// This means the child can't expand beyond the value of the maxHeight
// attribute.
// To adjust the flex line length to the size of maxMainSize, remaining
// positive free space needs to be re-distributed to other flex items
// (children views). In that case, invoke this method again with the same
// startIndex.
needsReexpand = true;
newHeight = lp.maxHeight;
mChildrenFrozen[childIndex] = true;
flexLine.mTotalFlexGrow -= lp.flexGrow;
} else {
accumulatedRoundError += (rawCalculatedHeight - newHeight);
if (accumulatedRoundError > 1.0) {
newHeight += 1;
accumulatedRoundError -= 1.0;
} else if (accumulatedRoundError < -1.0) {
newHeight -= 1;
accumulatedRoundError += 1.0;
}
}
int childWidthMeasureSpec = getChildWidthMeasureSpec(widthMeasureSpec, lp);
child.measure(childWidthMeasureSpec,
MeasureSpec.makeMeasureSpec(newHeight, MeasureSpec.EXACTLY));
}
flexLine.mMainSize += child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
flexLine.mCrossSize = Math.max(flexLine.mCrossSize, child.getMeasuredWidth());
}
childIndex++;
}